home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
scsidrv.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
5KB
|
218 lines
.include iocscall.mac
.include global.mac
.ifndef _S_REVISION
_S_REVISION equ $0A
.endif
;----------------------------------------------------------------
;IOCS _SCSIDRVルーチン
; _S_READ/_S_READEXTを自前で展開する
.text
.align 4,$2048
scsidrv_routine::
cmp.l #$21,d1 ;_S_READ
beq s_read
cmp.l #$26,d1 ;_S_READEXT
beq s_readext
call_old_scsidrv:
move.l scsidrv_old_vector,-(sp)
rts
.data
.align 4
scsidrv_old_vector:: .dc.l 0
;----------------------------------------------------------------
;_S_READ
;<d2.l:論理ブロック番号(2097151以下)
;<d3.l:転送ブロック数(255以下)
;<d4.l:ターゲットのSCSI-ID
;<d5.l:1ブロックのサイズ(0=256,1=512,2=1024)
;<a1.l:バッファの先頭アドレス
;>d0.l:
; 下位ワード ステータスインフェーズの結果
; 上位ワード メッセージインフェーズの結果
; -1,-2 異常終了
.text
.align 4,$2048
s_read:
tst.b hard_soft ;-hard/-softの指定がなければ古いルーチンを使う
bmi call_old_scsidrv
.if TEST_SCSIDRV
move.w #$03C0,$00E82200
.endif
st.b scsicmd_in_progress
movem.l d1-d4/a1,-(sp)
subq.l #6,sp
and.l #$000000FF,d3
beq 90f
lsl.l #8,d3 ;転送ブロック数<<8
move.w d3,(4,sp) ;+4 転送ブロック数
;+5 コントロールバイト
and.l #$001FFFFF,d2
move.l d2,(sp) ;+1 LUN,DPO,FUA,RelAdr
;+1~3 論理ブロック番号
move.b #$08,(sp) ;+0 オペレーションコード($08=Read)
moveq.l #_S_SELECT,d1
bsr call_old_scsidrv
tst.l d0
beq @f
moveq.l #_S_SELECT,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
@@:
swap.w d4
lsl.b #5,d4
or.b d4,(1,sp) ;LUN
movea.l sp,a1
moveq.l #_S_CMDOUT,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
lsl.l d5,d3 ;転送バイト数
movea.l (6+4*4,sp),a1 ;バッファの先頭アドレス(スタック注意)
moveq.l #_S_DATAIN,d1
tst.b hard_soft
beq @f
moveq.l #_S_DATAIN_P,d1
@@: bsr call_old_scsidrv
move.l d0,(sp)
beq @f
cmp.l #-2,d0
bne 90f
@@: clr.l (4,sp)
lea.l (4+3,sp),a1
moveq.l #_S_STSIN,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
lea.l (4+1,sp),a1
moveq.l #_S_MSGIN,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
move.l (4,sp),d0
bne 99f
move.l (sp),d0
99: addq.l #6,sp
movem.l (sp)+,d1-d4/a1
sf.b scsicmd_in_progress
.if TEST_SCSIDRV
move.w #$0000,$00E82200
.endif
tst.l d0
rts
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;_S_READEXT
;<d2.l:論理ブロック番号
;<d3.l:転送ブロック数(65535以下)
;<d4.l:ターゲットのSCSI-ID
;<d5.l:1ブロックのサイズ(0=256,1=512,2=1024)
;<a1.l:バッファの先頭アドレス
;>d0.l:
; 下位ワード ステータスインフェーズの結果
; 上位ワード メッセージインフェーズの結果
; -1,-2 異常終了
.text
.align 4,$2048
s_readext:
tst.b hard_soft ;-hard/-softの指定がなければ古いルーチンを使う
bmi call_old_scsidrv
.if TEST_SCSIDRV
move.w #$001E,$00E82200
.endif
st.b scsicmd_in_progress
movem.l d1/d3-d4/a1,-(sp)
lea.l (-10,sp),sp
and.l #$0000FFFF,d3
beq 90f
lsl.l #8,d3 ;転送ブロック数<<8
move.l d3,(6,sp) ;+6 reserved
;+7~8 転送ブロック数
;+9 コントロールバイト
move.l d2,(2,sp) ;+2~5 論理ブロック番号
move.w #$28_00,(sp) ;+0 オペレーションコード($28=ReadEXT)
;+1 LUN,DPO,FUA,RelAdr
moveq.l #_S_SELECT,d1
bsr call_old_scsidrv
tst.l d0
beq @f
moveq.l #_S_SELECT,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
@@:
swap.w d4
lsl.b #5,d4
or.b d4,(1,sp) ;LUN
movea.l sp,a1
moveq.l #_S_CMDOUT,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
lsl.l d5,d3 ;転送バイト数
movea.l (10+4*3,sp),a1 ;バッファの先頭アドレス(スタック注意)
moveq.l #_S_DATAIN,d1
tst.b hard_soft
beq @f
moveq.l #_S_DATAIN_P,d1
@@: bsr call_old_scsidrv
move.l d0,(sp)
beq @f
cmp.l #-2,d0
bne 90f
@@: clr.l (4,sp)
lea.l (4+3,sp),a1
moveq.l #_S_STSIN,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
lea.l (4+1,sp),a1
moveq.l #_S_MSGIN,d1
bsr call_old_scsidrv
tst.l d0
bne 90f
move.l (4,sp),d0
bne 99f
move.l (sp),d0
99: lea.l (10,sp),sp
movem.l (sp)+,d1/d3-d4/a1
sf.b scsicmd_in_progress
.if TEST_SCSIDRV
move.w #$0000,$00E82200
.endif
tst.l d0
rts
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
.if FORCE_CHANGE_SCSIDRV=0
;----------------------------------------------------------------
;IOCS _SCSIDRVのチェック
; _S_REVISIONの結果が$000A未満かどうか確かめる
.text
.align 4,$2048
scsidrv_check::
movem.l d0-d1,-(sp)
SCSI _S_REVISION
cmp.w #$000A,d0
slo.b old_scsidrv_flag ;_SCSIDRVが古いときセット,新しければリセット
movem.l (sp)+,d0-d1
rts
.data
old_scsidrv_flag: .dc.b 0 ;-1=_SCSIDRVが古い
;----------------------------------------------------------------
.endif